// 基于object封装 特点：无序，不能重复

function Set() {
  // 属性
  this.items = {}

  // 方法
  // 1.添加元素
  Set.prototype.add = function(value) {
    if (this.has(value)) return false
    this.items[value] = value
    return true
  }

  // 2.删除元素
  Set.prototype.remove = function(value) {
    if (!this.has(value)) return false
    delete this.items[value]
    return true
  }

  // 3.判断元素是否在集合中
  Set.prototype.has = function(value) {
    return this.items.hasOwnProperty(value)
  }

  // 4.移除集合中的所有项目
  Set.prototype.clear = function() {
    this.items = {}
    return true
  }

  // 5.集合项目数量
  Set.prototype.size = function() {
    return Object.keys(this.items).length
  }

  // 6.返回一个包含集合所有值的数组
  Set.prototype.values = function() {
    return Object.values(this.items)
  }

  // 7.两个集合的并集
  Set.prototype.union = function(otherSet) {
    let newSet = new Set()
    Object.values(this.items).forEach(value => {
      newSet.items[value] = value
    })

    Object.values(otherSet.items).forEach(value => {
      if (!this.has(value)) {
        newSet.items[value] = value
      }
    })

    return newSet
  }

  // 8.两个集合的交集

  Set.prototype.intersection = function(otherSet) {
    let newSet = new Set()

    Object.values(otherSet.items).forEach(value => {
      if (this.has(value)) {
        newSet.items[value] = value
      }
    })
    return newSet
  }


  // 9.两个集合的差集
  Set.prototype.difference = function(otherSet) {
    let newSet = new Set()
    Object.values(this.items).forEach(value => {
      newSet.items[value] = value
    })
    Object.values(otherSet.items).forEach(value => {
      if (this.has(value)) {
        newSet.remove(value)
      }
    })
    return newSet
  }

  // 10.两个集合的子集
  Set.prototype.subset = function(otherSet) {
    for (let value of Object.values(this.items)) {
      if (!otherSet.has(value)) {
        return false
      }
    }
    return true
  }
}

module.exports = Set